package com.fth.learn.chapter02;

/**
 * 学习位运算
 * YiMi
 *
 * @author YiMi
 * @version 1.0
 * @date 2023/4/15 9:20
 */

public class LearnOptions03 {

    public static void main(String[] args) {
        //正整数 有符号与无符号右移是相同
        System.out.println(3 >>> 1);
        System.out.println(3 >> 1);

        //补码：符号位不变，数值按位取反，末位再加1
        //反码：按原始位取反
        //补码转原码 ： 符号位不变，数值位按位取反，末位再加1，即补码的补码等于原码
        //-15 原码 10001111
        //原码不能参与运算 补码11110001
        //右移两位，没了两位，前面用1补两位  >>无符号右移
        //11111100  -15右移2位以后的补码
        //符号位不变，把补码转换成原码  取反+1
        //00000011  结尾再加1  100001000运算完成以后的原码 -4


        //负数
        //10000011 -3的原码


        System.out.println(-3 >> 1);
        //10000011 原码
        //11111101 补码
        //右移一位 11111110  补码运算
        //1000001 加1 1000010  -2

        System.out.println(-3 >>> 1);
        System.out.println(-5 >> 2);
        System.out.println(-23 >> 3);

        //有符号的负数右移 （符号位参与运算） 补0
        //正整数的右移有符号和无符号没区别 负数的无符号右移先求负数的原码再求补码 再运算 再返回成原码 部补位补的是1
        //10000011 原码
        //11111101 补码
        //01111110
        //所有的负数有符号右移都是正数




        //&数字位运算返回的是数，$$逻辑运算返回的是真假
        System.out.println(2 & 3);
//                        10 &11  同位为1落1 不同位落0  10
        System.out.println(18 & 27);
//        &相同位数同时为1  则为1
//        |相同位数有一个为1 则为1
//        ^相同位数不相同为1 相同为0
        System.out.println(7 | 16);
        //相同数 异或后依旧是0

        int a = 9;
        System.out.println(a++ > 3 && a++ > 4);//true
        System.out.println(a);//11
//        &&短逻辑与 一假为假 全真为真
        //&非短路逻辑与 全部算完再返回

        short ashort = 1;
//        懒人模式
        ashort += 1;
        ashort -= 1;
        ashort *= 1;
        ashort /= 1;

        int aint = 8;
        aint %= 2;
        System.out.println(aint);

//        Integer.valueOf("1"+1+1)-Integer.valueOf("1"+1);
        System.out.println(2+"3");



    }
}
